package com.linzm.leetcode.mid.tree.其他;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @Author zimingl
 * @Date 2023/2/25 0:18
 * @Description: 完全二叉树的节点个数
 * 给你一棵 完全二叉树 的根节点 root ，求出该树的节点个数。
 * 完全二叉树 的定义如下：在完全二叉树中，除了最底层节点可能没填满外，其余每层节点数都达到最大值，
 * 并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层，则该层包含 1~ 2h 个节点。
 * <p>
 * 输入：root = [1,2,3,4,5,6]
 * 输出：6
 * <p>
 * 树中节点的数目范围是[0, 5 * 104]
 * 0 <= Node.val <= 5 * 104
 * 题目数据保证输入的树是 完全二叉树
 */
public class Demo11CountNodes222 {
    public static void main(String[] args) {
        Demo11CountNodes222 demo11CountNodes222 = new Demo11CountNodes222();
        int i = demo11CountNodes222.countNodes3(TreeNode.getTree());
        System.out.println(i);
    }
    int count = 0;

    public int countNodes2(TreeNode root) {
        dfs(root);
        return count;
    }

    private void dfs(TreeNode root) {
        if (root == null) return;
        count++;
        dfs(root.left);
        dfs(root.right);
    }

    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        int count = 0;
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int len = queue.size();
            while (len-- > 0) {
                TreeNode node = queue.poll();
                count++;
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
        }
        return count;
    }

    public int countNodes3(TreeNode root) {
        if (root == null) return 0;
        return countNodes3(root.left) + countNodes3(root.right) + 1;
    }
}
